package com.zrrd.product.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zrrd.model.product.*;
import com.zrrd.product.mapper.*;
import com.zrrd.product.service.SkuInfoService;
import com.zrrd.service.cache.GmallCache;
import com.zrrd.service.constant.RedisConst;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.concurrent.TimeUnit;

@Service
public class SkuInfoServiceImpl extends ServiceImpl<SkuInfoMapper, SkuInfo> implements SkuInfoService {

    @Autowired
    private SkuImageMapper skuImageMapper;
    @Autowired
    private SkuSaleAttrValueMapper skuSaleAttrValueMapper;
    @Autowired
    private SkuAttrValueMapper skuAttrValueMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private RedissonClient redissonClient;
    @Autowired
    private BaseAttrInfoMapper baseAttrInfoMapper;

    @Override
    @Transactional
    public void saveSkuInfo(SkuInfo skuInfo) {
        //1.将基本信息添加到sku_info表中
        this.save(skuInfo);
        //2.将sku的图片列表保存到sku_image表中
        List<SkuImage> skuImageList = skuInfo.getSkuImageList();
        for (SkuImage skuImage : skuImageList) {
            skuImage.setSkuId(skuInfo.getId());
            skuImageMapper.insert(skuImage);
        }
        //3.将sku的销售属性信息保存到sku_sale_attr_balue表中（中间关系表 代表一个sku关联了哪些销售属性）
        List<SkuSaleAttrValue> skuSaleAttrValueList = skuInfo.getSkuSaleAttrValueList();
        for (SkuSaleAttrValue skuSaleAttrValue : skuSaleAttrValueList) {
            skuSaleAttrValue.setSkuId(skuInfo.getId());
            skuSaleAttrValue.setSpuId(skuInfo.getSpuId());
            skuSaleAttrValueMapper.insert(skuSaleAttrValue);
        }
        //4.将sku选择的平台属性保存到
        List<SkuAttrValue> skuAttrValueList = skuInfo.getSkuAttrValueList();
        for (SkuAttrValue skuAttrValue : skuAttrValueList) {
            skuAttrValue.setSkuId(skuInfo.getId());
            skuAttrValueMapper.insert(skuAttrValue);
        }
    }

    //根据skuid 获取sku的基本信息以及sku图片信息
    @Override
    @GmallCache(prefix = RedisConst.SKUKEY_PREFIX)
    public SkuInfo getSkuInfo(Long skuId) throws InterruptedException {
        //如果有意外情况 仍然还是从数据库中查询
        return getSKuInfoByDB(skuId);
    }

    //查询数据库Sku信息的方法
    private SkuInfo getSKuInfoByDB(Long skuId) {
        System.out.println("查询数据库的数据");
        //根据skuid查询sku的信息
        SkuInfo skuInfo = this.getById(skuId);
        //查询sku图片信息
        QueryWrapper<SkuImage> wrapper = new QueryWrapper<>();
        wrapper.eq("sku_id", skuId);
        //执行查询
        List<SkuImage> skuImages = skuImageMapper.selectList(wrapper);
        //将查询到的sku图片列表 设置给SkuInfo中
        skuInfo.setSkuImageList(skuImages);
        return skuInfo;
    }

    @Override
    @GmallCache(prefix = "skuPrice:")
    public BigDecimal getSkuPrice(Long skuId) {
        SkuInfo skuInfo = this.getById(skuId);
        if (skuInfo != null) {
            return skuInfo.getPrice();
        }
        return new BigDecimal("0");
    }

    @Override
    public Map getSkuValueIdsMap(Long spuId) {
        //创建最终要返回的map集合
        Map<Object, Object> map = new HashMap<>();
        //调用mapper查询List列表（包含多个map）
        List<Map> list = skuSaleAttrValueMapper.selectSaleAttrValueBySpu(spuId);
        if (list != null && list.size() > 0) {
            for (Map l : list) {
                map.put(l.get("value_ids"), l.get("sku_id"));
            }
        }
        return map;
    }

    @Override
    public List<BaseAttrInfo> getAttrList(Long skuId) {
        return baseAttrInfoMapper.getBaseAttrInfoBySkuId(skuId);
    }
}
